#!/bin/bash
# LinuxGSM fix.sh module
# Author: Daniel Gibbs
# Contributors: http://linuxgsm.com/contrib
# Website: https://linuxgsm.com
# Description: Overall function for managing fixes.
# Runs functions that will fix an issue.

functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"

# Messages that are displayed for some fixes.
fn_fix_msg_start() {
	fn_print_dots "Applying ${fixname} fix: ${gamename}"
	fn_print_info "Applying ${fixname} fix: ${gamename}"
	fn_script_log_info "Applying ${fixname} fix: ${gamename}"
}

fn_fix_msg_start_nl() {
	fn_print_dots "Applying ${fixname} fix: ${gamename}"
	fn_print_info_nl "Applying ${fixname} fix: ${gamename}"
	fn_script_log_info "Applying ${fixname} fix: ${gamename}"
}

fn_fix_msg_end() {
	if [ $? != 0 ]; then
		fn_print_error_nl "Applying ${fixname} fix: ${gamename}"
		fn_script_log_error "Applying ${fixname} fix: ${gamename}"
	else
		fn_print_ok_nl "Applying ${fixname} fix: ${gamename}"
		fn_script_log_pass "Applying ${fixname} fix: ${gamename}"
	fi
}

fn_exists_fix() {
	local short="${1:?}"

	if [ "$(type -t "fix_${short}.sh")" == 'function' ]; then
		return 0
	else
		return 1
	fi
}

fn_apply_fix() {
	local phase_message="${1:?}"
	local short="${2:?}"

	if fn_exists_fix "${short}"; then
		"fix_${short}.sh"
	else
		fn_print_error_nl "${shortname} is marked to apply pre start fix but there is no fix registered"
	fi
}

apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins nmrih onset rust rw sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
apply_post_install_fix=(av kf kf2 lo ro samp ut2k4 ut ut3)

# validate registered fixes for safe development
for fix in "${apply_pre_start_fix[@]}" "${apply_post_install_fix[@]}"; do
	if ! fn_exists_fix "${fix}"; then
		fn_print_fail_nl "fix_${fix}.sh is registered but doesn't exist. Typo or did you miss to modify core_functions.sh?"
		exitcode 1
		core_exit.sh
	fi
done

# Fixes that are run on start.
if [ "${commandname}" != "INSTALL" ] && [ -z "${fixbypass}" ]; then
	if [ "${appid}" ]; then
		fix_steamcmd.sh
	fi

	if grep -qEe "(^|\s)${shortname}(\s|$)" <<< "${apply_pre_start_fix[@]}"; then
		fn_apply_fix "pre start" "${shortname}"
	fi
fi

# Fixes that are run on install only.
if [ "${commandname}" == "INSTALL" ]; then
	if grep -qEe "(^|\s)${shortname}(\s|$)" <<< "${apply_post_install_fix[@]}"; then
		echo -e ""
		echo -e "${lightyellow}Applying Post-Install Fixes${default}"
		echo -e "================================="
		fn_sleep_time
		postinstall=1
		fn_apply_fix "post install" "${shortname}"
	fi
fi
